/**
 * @param {number[][]} matrix
 * @return {number[]}
 */

 const spiralOrder1 = matrix =>{
    const res = [];
    const [m,n] = [matrix.length,matrix[0]?.length];
    if(!m || !n){
        return res;
    }
    // 四个边界 值
    let [left,right,up,down] = [0,n-1,0,m-1];

    while(1){
        // 向右
        for(let j = left;j<=right;j++) res.push(matrix[up][j]);
        up++;
        if(up>down) break;
        // 向下
        for(let i = up;i<=down;i++) res.push(matrix[i][right]);
        right--;
        if(up>down) break;
        // 向左
        for(let j = right;j>=left;j--) res.push(matrix[down][j]);
        down--;
        if(left>right) break;
        // 向上
        for(let i = down;i>=up;i--) res.push(matrix[i][left]);
        left++;
        if(left>right) break;
    }
    return res;
}

console.log(spiralOrder([[1,2,3],[4,5,6],[7,8,9]]));

 var spiralOrder = function(matrix) {
    if(!matrix.length){
        return matrix;
    }
    let rowlength=matrix.length,collength=matrix[0].length;
    let res=[];
    // 圈数
    let ranks= Math.ceil(Math.min(rowlength,collength)/2);
    let row,col; // 当前行列值
    for(let rank=0;rank<ranks;rank++){
        row=rank,col=rank;
        // 用来判断是否是最后一趟
        let testrow=row,testcol=col;
        for(;col<collength-rank-1;col++){
            res.push(matrix[row][col])
        }
        for(;row<rowlength-rank-1;row++){
            res.push(matrix[row][col])
        }
        if(row==testrow || col==testcol){
            // 因为只剩最后一个数了，所以有一趟（向右或者向下）不会执行
            res.push(matrix[row][col]);
            break;
        }
        for(;col>rank;col--){
            res.push(matrix[row][col])
        }
        for(;row>rank;row--){
            res.push(matrix[row][col])
        }
    }
    return res;
};
let arr= [[1,2,3,4]
        ,[5,6,7,8]
        ,[9,10,11,12]]
console.log(spiralOrder(arr));